Skip to content

v1.9.0: shared filter dialog across list pages + unrated-as-0 rating semantics - #85

Merged
alvachien merged 7 commits into
mainfrom
feat/rating-unrated-semantics
Aug 30, 2026
Merged

v1.9.0: shared filter dialog across list pages + unrated-as-0 rating semantics#85
alvachien merged 7 commits into
mainfrom
feat/rating-unrated-semantics

Conversation

@alvachien

Copy link
Copy Markdown
Owner

Summary

  • Shared filter dialog (src/app/shared/filter-dialog/): one project-wide IFilterDefinition dialog now powers filtering on all four list pages — vocabulary, knowledge, Chinese, and translate — each with its own *_FILTER_PROPERTIES schema (design: docs/reusable-filter-dialog-design.md).
  • Rating semantics: unrated (0) is now treated as a numeric value in < / <= filters; the HasAny/HasNone operators were dropped (previously c02c6ac, docs follow-up a0737f2).
  • Version bumped to 1.9.0 (package.json + both environment files).

Commits

Commit Description
c02c6ac feat(rating): treat unrated (0) as numeric in < / <= filters; drop HasAny/HasNone
a0737f2 docs(vocabulary): reflect unrated-as-0 semantics and HasAny/HasNone removal
8f5fff5 chore: bump version to 1.8.434
6fbd2b5 feat(filter): shared filter dialog across all list pages
4b6f333 chore: bump version to 1.9.0

Stats

157 files changed, +16,959 / -7,361.

🤖 Generated with Claude Code

alvachien and others added 7 commits August 25, 2026 20:47
…sAny/HasNone

The rating < / <= filters previously excluded unrated (rating = 0) words
via a `rating > 0 &&` guard, so e.g. `< 1` matched nothing despite 0 < 1
being true. Remove the guard so unrated words compare numerically like any
other value. Since ratings are 1-5, `>= 1` now equals the former HasAny and
`< 1` equals the former HasNone, so the redundant HasAny/HasNone operators
are removed from the enum, matchRating, getRatingOperatorName, the three
Select-by-Rating dialogs (and their isValueDisabled getter + template
binding), and i18n. Vocabulary page (which never exposed HasAny/HasNone)
and the chinese/translate/knowledge Select-by-Rating dialogs all route
through the shared matchRating for consistent semantics. Tests updated.

Co-Authored-By: Claude <noreply@anthropic.com>
…emoval

Update the rating-filter matching description (unrated 0 now compared
numerically; < 1 matches unrated, >= 1 matches any rated) and the
RatingOperatorEnum member list (HasAny/HasNone dropped) in
vocabulary-exercises-architecture.md to match the code change in the
prior commit.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Complete the reusable-filter-dialog rollout (docs/reusable-filter-dialog-design.md):
the dialog, the vocabulary adoption, and the Chinese/translate/knowledge
migrations now live in the tree, replacing 7 page-local filter dialogs.

- src/app/shared/filter-dialog: tree editor + pure model (schema-driven
  properties, seed/emit round-trip, validation, summaries); string
  operators now expose actslib's full matrix incl. lexicographic/Between
- chinese: one filterDefinition + single Filter menu (was two dialogs/menus)
- translate: same collapse onto SENTENCE_FILTER_PROPERTIES; adds the
  missing top-level 'english' i18n key the old dialog rendered raw
- knowledge: KNOWLEDGE_FILTER_PROPERTIES with itemType as the enum proof
  (enumValues + choices labeled like the Type column)
- rating Between added to all four pages' whitelists (legacy dialogs never
  offered it; the shared editor does; unrated = 0 keeps comparing)
- retire RatingOperatorEnum/RatingCondition/matchRating/summarizeRatingFilter
  from ui-common (no hand-written matchers left)
- deprecate page-local select-by-rating dialogs; decompose translate page into
  session/result components; i18n + docs updated to as-built

Tests: 1826 passing across 71 spec files.

Co-Authored-By: Claude Code <noreply@anthropic.com>
Also re-syncs package-lock.json with package.json (version fields and the
actslib entry this branch added).

Co-Authored-By: Claude Code <noreply@anthropic.com>
The two wall-clock tests (sleep 150ms racing the constructor's
setTimeout(100)) timed out in CI on the linux runner even though they
pass locally. Create the component under a fake setTimeout clock and
advance it deterministically instead.
fixture.whenStable() relies on zone stability and stalled past the 5 s
test timeout on loaded CI runners (two integration tests failed there
while passing locally). Await renderMarkdown() directly, as the other
tests in this file already do.
@alvachien
alvachien merged commit 5563d86 into main Aug 30, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant